"""
删除每个分组中的第一个数据通常用于数据清理或者数据预处理中，
比如，每组的第一条数据是一个测试数据，在正式的数据分析中，需要我们将这个测试数据删除。
本例，我们就通过多种方式来用 pandas 完成这一需求。
"""
import pandas as pd

df = pd.DataFrame({
    'class': ['a', 'a', 'b', 'b', 'a', 'a', 'b', 'c', 'c'],
    'score': [3, 5, 6, 7, 8, 9, 10, 11, 14]
})

print(df)

# class 为分组列，索引 0、2 为各组的第一行数据，需要删除。

# 我们可以用多种思路来完成这个需求。
# 第一个方法是先分组，然后用切片取每个子 DataFrame 的除第一条数据外的数据：
df1 = df.groupby("class", group_keys=False).apply(lambda x: x[1:])
# group_keys=False 可以禁用分组键所形成的索引，不会删去原始对象的索引。
print(df1)

# 分组后用 tail() 取各子 DataFrame 长度减一长度的数据：
df2 = df.groupby("class", group_keys=False).apply(lambda x: x.tail(len(x) - 1))
print(df2)

# 分组后，各子 DataFrame 用 drop() 方法删除第一个索引的数据
df3 = df.groupby("class", group_keys=False).apply(lambda x: x.drop(x.index[0]))
print(df3)

# 分组求得各个数据在其分组中的序号（秩），然后排除序号为 1 的数据：
print(df.groupby('class').score.rank())
df4 = df[df.groupby('class').score.rank() != 1]
print(df4)
